package io.github.consoles.dsa;

/**
 * Created by yiihua-013 on 17/7/10.
 *
 * http://www.cnblogs.com/ikesnowy/p/7157826.html
 * <p>
 * 文本编辑器的缓冲区
 * <p>
 * 双栈模拟,左栈和右栈
 * <p>
 * 向左移动:从左栈弹出压入右栈。
 * 插入:向左栈压入元素
 * 删除:左栈弹出一个元素
 * 字符数量:左栈数量 + 右栈数量
 */
public class EditorBuffer {

    private LinkedStack<Character> leftStack;
    private LinkedStack<Character> rightStack;

    /**
     * 创建一块空缓冲区
     */
    public EditorBuffer() {
        leftStack = new LinkedStack<>();
        rightStack = new LinkedStack<>();
    }

    /**
     * 光标位置插入字符c
     *
     * @param c
     */
    void insert(char c) {
        leftStack.push(c);
    }

    /**
     * 删除并返回光标位置的字符
     *
     * @return
     */
    char delete() {
        return leftStack.pop();
    }

    /**
     * 光标向左移动k个位置
     *
     * @param k
     */
    void left(int k) {
        if (k > leftStack.size()) throw new RuntimeException("向左移动越界");
        for (int i = 0; i < k; i++) {
            rightStack.push(leftStack.pop());
        }
    }

    /**
     * 光标向右移动k个位置
     *
     * @param k
     */
    void right(int k) {
        if (k > rightStack.size()) throw new RuntimeException("向右移动越界");
        for (int i = 0; i < k; i++) {
            leftStack.push(rightStack.pop());
        }
    }

    /**
     * 缓冲区中的字符数量
     *
     * @return
     */
    int size() {
        return leftStack.size() + rightStack.size();
    }

    void printAll(){
        int pos = leftStack.size();
        System.out.println("pos = " + pos + ",size = " + size());
        System.out.println("光标左边");
        LinkedStack<Character> tmp = new LinkedStack<>();
        for (char c:leftStack) {
            tmp.push(c);
        }
        for (char c:tmp) {
            System.out.println(c);
        }
        System.out.println("光标右边");
        for (char c:rightStack) {
            System.out.println(c);
        }
    }
}
